/*
 * @Author: wuqingchun
 * @Date: 2024-04-20 22:33:26
 * @Description: C++ 类的基础语法
 * @LastEditors: wuqingchun
 * @LastEditTime: 2024-04-22 20:20:59
 */

#ifndef __CLASS_BASE_H__
#define __CLASS_BASE_H__

#include <string>
#include <atomic>

class ClassBase
{
public:
    // 静态成员变量(只读)
    static constexpr int MAX_NUMBER = 1024;

    // 静态成员变量
    // error: ISO C++ forbids in-class initialization of non-const static member ‘ClassBase::m_uiDerivedCount’
    // static unsigned int m_uiDerivedCount = 0;
    static unsigned int m_uiDerivedCount;

public:
    static std::atomic<unsigned int> m_uiAtomicDerivedCount_public;
protected:
    static std::atomic<unsigned int> m_uiAtomicDerivedCount_protected;
private:
    static std::atomic<unsigned int> m_uiAtomicDerivedCount_private;

public:
    // 静态成员函数
    static void ShowDerivedCount();
public:
    // 无参数构造函数
    // 如果没有实现，编译器会实现一个默认的无参构造函数
    ClassBase();

    // 析构函数
    // 如果没有实现，编译器会实现一个默认的析构函数
    ~ClassBase();

    // 拷贝构造函数
    // 如果没有实现，编译器会实现一个默认的拷贝构造函数
    ClassBase(const ClassBase& refCls);

    // 移动构造函数
    ClassBase(ClassBase&& refCls);
    
    // 赋值运算符
    ClassBase& operator=(const ClassBase& refCls);

    // 虚函数
    virtual void ShowInfo() const;
    
    // 成员函数
    // 公开成员函数
public:
    void SetName(const std::string& refName);
    const std::string& GetName() const;
    

    // 保护成员函数
protected:

    // 私有成员函数
private:
    void __SetName(const std::string& refName);

    // 公开成员函数
public:
    int m_iNumber = 0;
    // 保护成员函数
protected:
    double m_dfPrice = 0.0;

    // 私有成员函数
private:
    // 成员变量
    std::string m_strName;
};





#endif //__CLASS_BASE_H__
